﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BatallaNavalgo.Tests
{
    [TestClass]
    public class TestTablero
    {
        Tablero tablero;



        public TestTablero()
        {
            this.tablero = new Tablero();
        }



        [TestMethod]
        public void TestElTableroDeberiaCrearseConNaves()
        {
            Assert.IsTrue(this.tablero.Naves.Count == 7);
        }

   

        [TestMethod]
        public void TestElTableroDebeMoverLasNavesSegunSuDireccion()
        {
            int orientacion = 0;
            int[] posicionBuque = new int[2];
            posicionBuque[0] = 0;
            posicionBuque[1] = 0;
            int[] posicionDestructor = new int[2];
            posicionDestructor[0] = 0;
            posicionDestructor[1] = 1;
            int[] direccion = new int[2];
            direccion[0] = 1;
            direccion[1] = 0;

            Buque buque = new Buque(posicionBuque, direccion, orientacion, this.tablero);
            Destructor destructor = new Destructor(posicionDestructor, direccion, orientacion, this.tablero);

            this.tablero.CargarNave(buque);
            this.tablero.CargarNave(destructor);


            this.tablero.PasarTurno();

            FragmentoDeNave[] fragmentosBuque = this.tablero.Naves[7].Fragmentos;
            FragmentoDeNave[] fragmentosDestructor = this.tablero.Naves[8].Fragmentos;

            Assert.IsTrue(fragmentosBuque[0].Posicion[0] == 1);
            Assert.IsTrue(fragmentosBuque[0].Posicion[1] == 0);
            Assert.IsTrue(fragmentosDestructor[0].Posicion[0] == 1);
            Assert.IsTrue(fragmentosDestructor[0].Posicion[1] == 1);
        }

        [TestMethod]
        public void TestTableroDebeIndicarErrorSiIntentoObtenerUnaCasillaDeUnaPosicionIncorrecta()
        {
            Tuple<int, int> posicion = Tuple.Create(-1, 0);
            try
            {
                this.tablero.GetCasilla(posicion);
                Assert.Fail("No lanzó la excepción");
            }
            catch (PosicionIncorrectaException e)
            {
                Assert.IsTrue(e is PosicionIncorrectaException);
            }
        }

        [TestMethod]
        public void TestTableroDebeColocarDisparoConvencionalCorrectamente()
        {
            Tuple<int, int> posicion = Tuple.Create(5, 5);
            DisparoConvencional disparo = new DisparoConvencional(0);
            this.tablero.ColocarDisparo(disparo, posicion);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Contains(disparo));
        }

        [TestMethod]
        public void TestTableroDebeColocarMinaPuntualCorrectamente()
        {
            Tuple<int, int> posicion = Tuple.Create(5, 5);
            MinaPuntual mina = new MinaPuntual(2);
            this.tablero.ColocarDisparo(mina, posicion);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Contains(mina));
        }

        [TestMethod]
        public void TestTableroDebeColocarMinaPorContactoCorrectamente()
        {
            Tuple<int, int> posicion = Tuple.Create(5, 5);
            MinaPorContacto mina = new MinaPorContacto(0);
            this.tablero.ColocarDisparo(mina, posicion);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Contains(mina));
        }

        [TestMethod]
        public void TestTableroDebeColocarMinaDobleCorrectamente()
        {
            Tuple<int, int> posicion = Tuple.Create(5, 5);
            MinaDoble mina = new MinaDoble(2);
            this.tablero.ColocarDisparo(mina, posicion);
            /*Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Contains(mina));
            posicion = Tuple.Create(4, 5);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(6, 5);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(4, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(5, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(6, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(4, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(5, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(6, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));*/
        }

        public bool EsMina(Disparo disparo)
        {
            if (disparo is MinaPuntual)
                return true;
            return false;
        }

        [TestMethod]
        public void TestTableroDebeColocarMinaTripleCorrectamente()
        {
            Tuple<int, int> posicion = Tuple.Create(5, 5);
            MinaTriple mina = new MinaTriple(2);
            this.tablero.ColocarDisparo(mina, posicion);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Contains(mina));
            /*posicion = Tuple.Create(3, 5);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(4, 5);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(6, 5);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(7, 5);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(3, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(4, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(5, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(6, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(7, 4);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(3, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(4, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(5, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(6, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(7, 6);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(3, 3);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(4, 3);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(5, 3);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(6, 3);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            posicion = Tuple.Create(7, 3);
            Assert.IsTrue(this.tablero.GetCasilla(posicion).Disparos.Exists(EsMina));
            */
        }

        [TestMethod]
        public void TestElTableroPasaTurnoCorrectamente()
        {
            Tuple<int, int> posicionUno = Tuple.Create(5, 5);
            Tuple<int, int> posicionDos = Tuple.Create(0, 0);
            MinaPuntual mina1 = new MinaPuntual(2);
            MinaPuntual mina2 = new MinaPuntual(2);

            this.tablero.ColocarDisparo(mina1, posicionUno);
            this.tablero.ColocarDisparo(mina2, posicionDos);

            this.tablero.PasarTurno();
            foreach (Disparo disparo in this.tablero.GetCasilla(posicionUno).Disparos)
                Assert.IsTrue(disparo.Turno == 1);
            foreach (Disparo disparo in this.tablero.GetCasilla(posicionDos).Disparos)
                Assert.IsTrue(disparo.Turno == 1);
        }

      
    }
}
